#include <QFileInfo>
#include "proyecto.h"
#include "asistentexml.h"

Proyecto::Proyecto()
{

}

Proyecto::~Proyecto()
{

}

void Proyecto::serializar(const QString& nombreArchivo)
{
    if (!nombreArchivo.isEmpty()) {
		this->nombreArchivo = nombreArchivo;
	}

	QFileInfo fileInfo(nombreArchivo);
	nombre = fileInfo.baseName();

    AsistenteXml asistente;
	asistente.crearNuevo("proyecto");

	QDomElement elementoProyecto = asistente.getElementoRaiz();

    asistente.escribirAtributo(elementoProyecto, "nombre", nombre);

    foreach (Compas compas, listaCompases) {
        QDomElement elementoCompas = asistente.escribirElemento(elementoProyecto, "compas");
        compas.serializar(elementoCompas);
    }

    foreach (Patron patron, listaPatrones) {
        QDomElement elementoPatron = asistente.escribirElemento(elementoProyecto, "patron");
        patron.serializar(elementoPatron);
    }

	asistente.guardarEnArchivo(this->nombreArchivo);
}

void Proyecto::deserializar(const QString& nombreArchivo)
{
    AsistenteXml asistente;
	asistente.recuperarDeArchivo(nombreArchivo);

	QDomElement elementoProyecto = asistente.getElementoRaiz();

    nombre = asistente.leerAtributo(elementoProyecto, "nombre");
	this->nombreArchivo = nombreArchivo;
    
    listaCompases.clear();
    QList<QDomElement> listaElementosCompas = asistente.leerElementos(elementoProyecto, "compas");
    foreach (QDomElement elementoCompas, listaElementosCompas) {
        Compas compas;
        compas.deserializar(elementoCompas);
        listaCompases.append(compas);
    }

    listaPatrones.clear();
    QList<QDomElement> listaElementosPatron = asistente.leerElementos(elementoProyecto, "patron");
    foreach (QDomElement elementoPatron, listaElementosPatron) {
        Patron patron;
        patron.deserializar(elementoPatron, this);
        listaPatrones.append(patron);
    }

    listaEjercicios.clear();
    QList<QDomElement> listaElementosEjercicio = asistente.leerElementos(elementoProyecto, "ejercicio");
    foreach (QDomElement elementoEjercicio, listaElementosEjercicio) {
        Ejercicio ejercicio;
        ejercicio.deserializar(elementoEjercicio, this);
        listaEjercicios.append(ejercicio);
    }
}

Compas Proyecto::getCompas(int indice)
{
	if (indice < 0 || indice >= listaCompases.size()) {
		return Compas();
	} else {
		return listaCompases[indice];
	}
}

Compas Proyecto::getCompas(const QString& nombreCompas)
{
    for (int indice = 0; indice < listaCompases.size(); indice++) {
        if (listaCompases[indice].getNombre() == nombreCompas) {
            return listaCompases[indice];
        }
	}
    return Compas();
}

void Proyecto::agregarPatron(const Patron& patron)
{
    listaPatrones.append(patron);
}

Patron Proyecto::getPatron(int indice)
{
    if (indice < 0 || indice >= listaPatrones.size()) {
		return Patron();
	} else {
		return listaPatrones[indice];
	}
}

Patron Proyecto::getPatron(const QString& nombrePatron)
{
    for (int indice = 0; indice < listaPatrones.size(); indice++) {
        if (listaPatrones[indice].getNombre() == nombrePatron) {
            return listaPatrones[indice];
        }
	}
    return Patron();
}

Ejercicio Proyecto::getEjercicio(int indice)
{
	if (indice < 0 || indice >= listaEjercicios.size()) {
		return Ejercicio();
	} else {
		return listaEjercicios[indice];
	}
}

Ejercicio Proyecto::getEjercicio(const QString& nombreEjercicio)
{
    for (int indice = 0; indice < listaEjercicios.size(); indice++) {
        if (listaEjercicios[indice].getNombre() == nombreEjercicio) {
            return listaEjercicios[indice];
        }
	}
    return Ejercicio();
}

QList<Compas> Proyecto::getCompases(const QString& mascara)
{
    QRegExp expresion(mascara, Qt::CaseSensitive, QRegExp::Wildcard);
    QList<Compas> listaCompasesCoincidentes;

    for (int indice = 0; indice < listaCompases.size(); indice++) {
        if (expresion.exactMatch(listaCompases[indice].getNombre())) {
            listaCompasesCoincidentes.append(listaCompases[indice]);
        }
	}  
    return listaCompasesCoincidentes;
}

QList<Patron> Proyecto::getPatrones(const QString& mascara)
{
    QRegExp expresion(mascara, Qt::CaseSensitive, QRegExp::Wildcard);
    QList<Patron> listaPatronesCoincidentes;

    for (int indice = 0; indice < listaPatrones.size(); indice++) {
        if (expresion.exactMatch(listaPatrones[indice].getNombre())) {
            listaPatronesCoincidentes.append(listaPatrones[indice]);
        }
	}  
    return listaPatronesCoincidentes;
}

void Proyecto::agregarCompas(const Compas& compas)
{
    listaCompases.append(compas);
}

void Proyecto::quitarCompas(const Compas& compas)
{
    for (int indice = 0; indice < listaCompases.size(); indice++) {
        if (listaCompases[indice].getNombre() == compas.getNombre()) {
            listaCompases.removeAt(indice);
        }
	}
}
